Re-enable improved PAL code (time and perfmon work again). PAL code remapped
authordjm@kirby.fc.hp.com <djm@kirby.fc.hp.com>
Sun, 18 Sep 2005 16:30:57 +0000 (10:30 -0600)
committerdjm@kirby.fc.hp.com <djm@kirby.fc.hp.com>
Sun, 18 Sep 2005 16:30:57 +0000 (10:30 -0600)
_lazily_ only when PAL called after rr7 changes.  Old PAL emulator can
be re-enabled with #define USE_PAL_EMULATOR in config.h.
Signed-off by: Dan Magenheimer <dan.magenheimer@hp.com>

xen/arch/ia64/linux-xen/efi.c
xen/arch/ia64/xen/dom_fw.c
xen/include/asm-ia64/config.h

index e2ba47d0005c55da46d492d7f880dea8fb060c0a..c75f0fe728af78323676b9922425986a6c8cc46a 100644 (file)
@@ -525,7 +525,7 @@ efi_get_pal_addr (void)
 
 
 #ifdef XEN
-void *pal_vaddr;
+void *pal_vaddr = 0;
 #endif
 
 void
@@ -533,14 +533,39 @@ efi_map_pal_code (void)
 {
 #ifdef XEN
        u64 psr;
-       pal_vaddr = efi_get_pal_addr ();
+       static unsigned long last_rr7 = 0;
+       unsigned long current_rr7 = ia64_get_rr(7L<<61);
+
+       // this routine is called only once in Linux but may be called
+       // multiple times in Xen.  However, we only need to flush and
+       // reset itr[IA64_TR_PALCODE] if rr7 changes
+       if (!pal_vaddr) {
+               pal_vaddr = efi_get_pal_addr ();
+               last_rr7 = current_rr7;
+       }
+       else if (last_rr7 == current_rr7) return;
+       else {
+               last_rr7 = current_rr7;
+               printk("efi_map_pal_code,remapping pal w/rr7=%lx\n",last_rr7);
+       }
+
+       printf("efi_map_pal_code: about to ia64_ptr(%d,%p,%p)\n",
+               0x1, GRANULEROUNDDOWN((unsigned long) pal_vaddr),
+                IA64_GRANULE_SHIFT);
+       ia64_ptr(0x1, GRANULEROUNDDOWN((unsigned long) pal_vaddr),
+                IA64_GRANULE_SHIFT);
+       ia64_srlz_i();
+       printf("efi_map_pal_code: about to ia64_itr(%p,%p,%p,%p,%p)\n",
+               0x1, IA64_TR_PALCODE, GRANULEROUNDDOWN((unsigned long) pal_vaddr),
+                pte_val(pfn_pte(__pa(pal_vaddr) >> PAGE_SHIFT, PAGE_KERNEL)),
+                IA64_GRANULE_SHIFT);
 #else
        void *pal_vaddr = efi_get_pal_addr ();
        u64 psr;
-#endif
 
        if (!pal_vaddr)
                return;
+#endif
 
        /*
         * Cannot write to CRx with PSR.ic=1
index a6f5cec450f7602d87c73982c901daf70b380bcd..ca22fafaccf35c74bfa5df71a0c20fa03f56be66 100644 (file)
@@ -291,16 +291,18 @@ xen_pal_emulator(unsigned long index, unsigned long in1,
        long r11 = 0;
        long status = -1;
 
-#define USE_PAL_EMULATOR
-#ifdef USE_PAL_EMULATOR
-       return pal_emulator_static(index);
-#endif
        if (running_on_sim) return pal_emulator_static(index);
        if (index >= PAL_COPY_PAL) {
-               printk("xen_pal_emulator: UNIMPLEMENTED PAL CALL %d!!!!\n",
-                               index);
+               // build_hypercall_bundle needs to be modified to generate
+               // a second bundle that conditionally does a br.ret
+               panic("xen_pal_emulator: stacked calls not supported!!\n");
        }
-       else switch (index) {
+       printk("xen_pal_emulator: index=%d\n",index);
+       // pal code must be mapped by a TR when pal is called, however
+       // calls are rare enough that we will map it lazily rather than
+       // at every context switch
+       efi_map_pal_code();
+       switch (index) {
            case PAL_MEM_ATTRIB:
                status = ia64_pal_mem_attrib(&r9);
                break;
@@ -514,11 +516,12 @@ dom_fw_init (struct domain *d, char *args, int arglen, char *fw_mem, int fw_mem_
 */
        memset(fw_mem, 0, fw_mem_size);
 
-#ifdef XEN
-#else
+#ifdef USE_PAL_EMULATOR
        pal_desc = (unsigned long *) &pal_emulator_static;
-       sal_desc = (unsigned long *) &sal_emulator;
+#else
+       pal_desc = (unsigned long *) &xen_pal_emulator;
 #endif
+       sal_desc = (unsigned long *) &sal_emulator;
 
        cp = fw_mem;
        efi_systab  = (void *) cp; cp += sizeof(*efi_systab);
index 5e13f290ba89573f364a7eb3ab23c9d5d8b6d514..268cd3ebff4150e6af3571f5262750a1f965db88 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef        _IA64_CONFIG_H_
 #define _IA64_CONFIG_H_
 
+#undef USE_PAL_EMULATOR
 // control flags for turning on/off features under test
 #undef CLONE_DOMAIN0
 //#define CLONE_DOMAIN0 1